package com.AdvancedDemos.Learn日志技术;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LearnLog {
    //创建Logger日志对象
    public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");//由LoggerFactory.getLogger("日志文件名称")获得Logger对象

    public static void main(String[] args) {
        /**
         * <日志技术>
         * 程序中的日志，通常就是一个文件，里面记录的是程序运行过程中的各种信息。
         * 可以将系统执行的信息，方便的记录到指定的位置（控制台、文件中、数据库中）。
         * 可以随时以开关的形式控制日志的启停，无需侵入到源代码中去进行修改。
         *
         * 日志框架:牛人或者第三方公司已经做好的实现代码，后来者直接可以拿去使用。
         * 常见日志框架:
         * JUL(java.util.logging)
         * Log4j
         * Logback
         * ...
         *
         * 日志接口:设计日志框架的一套标准，日志框架需要实现这些接口。
         * Commons Logging (JCL)
         * Simple Logging Facade for Java (SLF4J)
         *
         *
         * JUL(java.util.logging) >-implements-> Commons Logging (JCL)
         * Log4j & Logback >-implements-> Simple Logging Facade for Java (SLF4J)
         *
         * 注意1∶因为对Commons Logging接口不满意，有人就搞了SLF4J;因为对Log4j的性能不满意有人就搞了Logback。
         * 注意2:Logback是基于slf4j的日志规范实现的框架。
         */

        /**
         * Logback旨在作为流行的log4j的继任者项目，Logback的架构非常通用，因此可以应用在不同的情况下。目前，Logback是分开的分为三个模块，Logback-core，Logback-classic和Logback-acess。
         * logback-core模块为其他两个模块奠定了基础模块。logback-classic模块可以同化为显著改进了Log4j1.x的版本。此外logback-classic原生实现了SLF4J API，以便您随时可以在logback和其他日志记录框架之间来回切换例如log4j 1.x或java.util.loggings(JUL)。
         * Logback-access与Servlet容器集成，如Tomcat和Jetty，提供HTTP访问日志功能性。
         *
         * Logback快速入门
         * 需求
         * 使用Logback日志框架，纪录系统的运行信息。
         * 实现步骤
         * ①:导入Logback框架到项目中去。
         * slf4j-api:日志接口
         * logback-core
         * logback-classic
         * ②:将Logback框架的核心配置文件logback.xml直接拷贝到src目录下（必须是src下,logback-core会去调用logback.xml)。
         * ③:创建Logback框架提供的Logger对象，然后用Logger对象调用其提供的方法就可以记录系统的日志信息。
         * public static final Logger LOGGER = LoggerFactory.getLogger(“类名")
         */

        //核心配置文件logback.xml,是对logback日志框架进行控制的

        //日志的输出位置、输出格式的设置:
        //通常可以设置2个输出日志的位置:一个是控制台、一个是系统文件中
        //<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        //<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        //向文件输出时通过<file>D:/testLog/exampleData.log</file>指定日志输出路径

        //开启日志(ALL)，取消日志(OFF)
        // <root level="ALL">
        // <appender-ref ref="CONSOLE"/>
        // <appender-ref ref="FILE"/>
        // </root>


        for (int i = 0; i < 100000; i++) {
            try {
                LOGGER.info("chu方法开始执行~~~");//记录程序信息
                //2023-03-22 19:10:13.450 [INFO ] LogBackTest [main] : chu方法开始执行~~~
                chu(10, 0);
                LOGGER.info("chu方法执行成功~~~");
            } catch (Exception e) {
                LOGGER.error("chu方法执行失败了,出现了bug~~~");//记录程序错误
                //2023-03-22 19:10:13.457 [ERROR] LogBackTest [main] : chu方法执行失败了,出现了bug~~~
            }
        }


        /*
        <日志级别>
        日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):
        低  trace --- 追踪，指明程序运行轨迹
        ↓  debug --- 调试，实际应用中一般将其作为最低级别，而trace则很少使用
        ↓  info --- 输出重要的运行信息，数据连接、网络连接、IO操作等等，使用
        ↓  warn --- 警告信息，可能会发生问题，使用较多
        高  error --- 错误信息，使用较多

        <!--只有日志的级别大于等于核心配置文件配置的日志界别,才会被记录,否则不记录-->
        */


    }

    public static void chu(int a, int b) {
        LOGGER.debug("参数a:" + a);//记录程序执行流程
        //2023-03-22 19:10:13.456 [DEBUG] LogBackTest [main] : 参数a:10
        LOGGER.debug("参数b:" + b);
        //2023-03-22 19:10:13.456 [DEBUG] LogBackTest [main] : 参数b:0
        int c = a / b;
//        System.out.println("结果是:" + c);
        LOGGER.info("结果是:" + c);
    }
}
